﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using grupo2DEWStudio7i.Persistencia.ADO;   
using NUnit.Framework;
using grupo2DEWStudio7i.Dominio;
using grupo2DEWStudio7i.Persistencia;

namespace grupo2DEWStudio7i.Pruebas
{
    public class TestInstrumentoDAO
    {
        InstrumentoDAO dao = null;
        private int codigoGenerado = 0;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            dao = new InstrumentoDAO();
            foreach (Instrumento i in dao.ListarTodos()) dao.Eliminar(i);
            dao.Crear(new Instrumento() { TipoInstru = "Guitarra", MarcaInstru = "Fender", ModeloInstru = "Squier", AñoFabricacion = 2009, Caracteristicas = "Color madera", CostoxHora = 10 });
        }

        [Test]
        public void Test1_Crear_OK()
        {
            //Assert.IsNotNull(dao);
            Instrumento instrumentoACrear = new Instrumento();
            instrumentoACrear.TipoInstru = null;
            Instrumento InstrumentoCreado = null; 
            Assert.Catch<Exception>(delegate
            {
                InstrumentoCreado = dao.Crear(instrumentoACrear);
            });
            instrumentoACrear.TipoInstru = "Bateria";
            instrumentoACrear.MarcaInstru = "Yamaha";
            instrumentoACrear.ModeloInstru = "Fields";
            instrumentoACrear.AñoFabricacion = 2011;
            instrumentoACrear.Caracteristicas = "Azul";
            instrumentoACrear.CostoxHora = 11;
            // Probamos que no ocurra error al crear
            Assert.DoesNotThrow(delegate
            {
                InstrumentoCreado = dao.Crear(instrumentoACrear);
                codigoGenerado = InstrumentoCreado.CodInstrumento;
            }, "Instrumento creado Exitosamente");
            // Probamos que no sea nulo
            Assert.IsNotNull(InstrumentoCreado);
            // Probamos que el código generado sea mayor o igual a 2
            Assert.GreaterOrEqual(InstrumentoCreado.CodInstrumento, 2);
            // Probamos que el costo registrado es igual al solicitado
            Assert.AreEqual(InstrumentoCreado.CostoxHora, instrumentoACrear.CostoxHora);
        }

        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(dao);
            // 3. Declaramos la entidad que contendrá el resultado
            Instrumento instrumentoObtenida = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                instrumentoObtenida = dao.Obtener(codigoGenerado);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(instrumentoObtenida);
            Assert.AreEqual(instrumentoObtenida.CodInstrumento, codigoGenerado);
        }
        [Test]
        public void Test3_Modificar()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(dao);
            // 2. Declaramos e instanciamos la entidad de dominio
            Instrumento instrumentoAModificar = dao.Obtener(codigoGenerado);
            instrumentoAModificar.TipoInstru = "Baterias";
            instrumentoAModificar.MarcaInstru = "Yamaha";
            instrumentoAModificar.ModeloInstru = "Fields";
            instrumentoAModificar.AñoFabricacion = 2010;
            instrumentoAModificar.Caracteristicas = "azul";
            instrumentoAModificar.CostoxHora = 11;
            // 3. Declaramos la entidad que contendrá el resultado
            Instrumento instrumentoModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 4. Ejecutamos el método a probar
                instrumentoModificado = dao.Modificar(instrumentoAModificar);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(instrumentoModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(instrumentoModificado.CodInstrumento, codigoGenerado);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(instrumentoModificado.TipoInstru, instrumentoAModificar.TipoInstru);

        }
        [Test]
        public void Test4_Eliminar_OK()
        {
            Assert.IsNotNull(dao);
            Instrumento localExistente = dao.Obtener(codigoGenerado);
            Assert.DoesNotThrow(delegate
            {
                dao.Eliminar(localExistente);
            }, "Instrumento Eliminado Exitosamente");
            // Probamos que ya no existe
            Assert.IsNull(dao.Obtener(codigoGenerado));
        }

        [Test]
        public void Test5_ListarTodos()
        {
            //Assert.IsNotNull(dao);
            ICollection<Instrumento> instrumentosEncontradas = null;
            Assert.DoesNotThrow(delegate
            {
                instrumentosEncontradas = dao.ListarTodos();
            });
            Assert.IsNotNull(instrumentosEncontradas);
            // Probamos que la cantidad encontrada sea 1
            Assert.GreaterOrEqual(instrumentosEncontradas.Count, 1);
        }

        [Test]
        public void Test6_ListarXTipo_OK()
        {
           // Assert.IsNotNull(dao);
            string busqueda = "uitarr";
            ICollection<Instrumento> InstrumentoesEncontrados = null;
            // Probamos que no ocurra error al listar
            Assert.DoesNotThrow(delegate
            {
                InstrumentoesEncontrados = dao.ListarXTipo(busqueda);
            });
            // Probamos que no sea nulo
            Assert.IsNotNull(InstrumentoesEncontrados);
            // Probamos que la cantidad de instrumento encontrados sea 1
            Assert.AreEqual(InstrumentoesEncontrados.Count, 1);
            // Probamos que contenga la cadena de búsqueda en su tipo
            foreach (Instrumento InstrumentoEncontrado in InstrumentoesEncontrados)
            {
                Assert.IsTrue(InstrumentoEncontrado.TipoInstru.Contains(busqueda));
            }
        }
    }
}